############################################################
#GPL code Makefile, by ZQQ, 2017.3.7
############################################################

export BOARD_TYPE?=ralink
export PID?=wpa4530v1
export RELEASE?=eu
export CFG_DOUBLE_BOOT?=1

ifndef PID
$(error "You have to define product id, (PID=wpa4530v1).")
endif

##################################################################################################
# Include the specific configuration files from the config.boardtype file
# here.  This removes the need to set environmental variables through a
# script before building
##################################################################################################
include products_config/$(PID)/config.$(PID)

##################################################################################################
#
#	product makefile.
#
##################################################################################################
include Makefile.$(PID)
#include Makefile.kernelmodules
include Makefile.apps

#################################################################################################
#
#	if BUILD_SUBDIR undefined, then 
#		we want to make a target specified in main-control Makefile	
#	else
#		we want to make a single target in subdir-Makefile,
#		subdir is specified by $(BUILD_SUBDIR)
#	endif
#
##################################################################################################
ifndef BUILD_SUBDIR


##################################################################################################
#
#	common rule	
#
##################################################################################################
%_rebuild: %_clean %_build %_install
	@echo "rebuild <$@> at `date`."

%: %_build %_install
	@echo "built and installed <$@> at `date`."	

	
##################################################################################################
#
#	convenient build target	
#
##################################################################################################
export SDKLIBS_TARGET_COMMON = 
#export TPLIBS_TARGET_COMMON =libcjson libmsgcenter ucm libwrapper liblog libappconf libutil libplcapi libwolfssl
#export TPAPPS_TARGET_COMMON = $(TPAPPS_SELECT)
export TPAPPS_TARGET_COMMON = 
export SDK_TARGET_COMMON = kernel apps
export KERNEL_MODULES_TARGET_COMMON = parentCtrl br_guest_filter
export APPS_TARGET_COMMON = busybox sar bridge wireless_tools 
ifeq ($(TPAPPS_IPV6_ENABLE), 1)
export APPS_TARGET_COMMON := $(APPS_TARGET_COMMON) ipv6_tools
endif

export sdklibs_target = $(SDKLIBS_TARGET_ADDITIONAL) $(filter-out $(SDKLIBS_TARGET_EXCLUDE), $(SDKLIBS_TARGET_COMMON))
export tplibs_target = $(TPLIBS_TARGET_ADDITIONAL) $(filter-out $(TPLIBS_TARGET_EXCLUDE), $(TPLIBS_TARGET_COMMON))
export tpapps_target = $(TPAPPS_TARGET_ADDITIONAL) $(filter-out $(TPAPPS_TARGET_EXCLUDE), $(TPAPPS_TARGET_COMMON))
export sdk_target = $(SDK_TARGET_ADDITIONAL) $(filter-out $(SDK_TARGET_EXCLUDE), $(SDK_TARGET_COMMON))
export kernel_modules_target = $(filter-out $(KERNEL_MODULES_TARGET_EXCLUDE), $(KERNEL_MODULES_TARGET_COMMON)) 
export apps_target = $(APPS_TARGET_ADDITIONAL) $(filter-out $(APPS_TARGET_EXCLUDE), $(APPS_TARGET_COMMON))
export platform_util = fakeroot make_flash json2bin make_header

##################################################################################################
#
#	everything.
#
##################################################################################################
export everyrules = $(addprefix $(PID)_, config prep build install clean)
export everything = $(EVERYTHING_ADDITIONAL) $(filter-out $(EVERYTHING_EXCLUDE), $(sdklibs_target) $(tplibs_target) $(sdk_target) $(tpapps_target))

everything_show:
	#@echo SDKLIBS_TARGET_ADDITIONAL=$(SDKLIBS_TARGET_ADDITIONAL)
	#@echo TPLIBS_TARGET_ADDITIONAL=$(TPLIBS_TARGET_ADDITIONAL)
	#@echo TPAPPS_TARGET_ADDITIONAL=$(TPAPPS_TARGET_ADDITIONAL)
	#@echo SDK_TARGET_ADDITIONAL=$(SDK_TARGET_ADDITIONAL)
	#@echo KERNEL_MODULES_TARGET_COMMON=$(KERNEL_MODULES_TARGET_COMMON)
	#@echo APPS_TARGET_COMMON=$(APPS_TARGET_COMMON)
	#@echo APPS_TARGET_ADDITIONAL=$(APPS_TARGET_ADDITIONAL)
	#@echo TPAPPS_TARGET_COMMON=$(TPAPPS_TARGET_COMMON)
	#@echo EVERYTHING_ADDITIONAL=$(EVERYTHING_ADDITIONAL)
	#@echo everything=$(everything)
	@echo sdklibs_target=$(sdklibs_target) $(tplibs_target) $(sdk_target) $(tpapps_target)
	
	
everything_config:
	@echo will config kernel or apps in future.
#	@make apps_config kernel_config

everything_prep: $(addsuffix _prep, $(platform_util) toolchain fs)
	@make everything_config
ifneq ($(strip $(sdklibs_target)),)
	@make $(sdklibs_target)	
endif

	
# libڱɺضlibĿ¼ŻЧ˴˴lib_targetó	
	
everything_build: $(sdklibs_target) $(tplibs_target) $(addsuffix _build, $(sdk_target) $(tpapps_target))
	@echo make $@ done.

everything_install: $(addsuffix _install, $(everything))
	@echo make $@ done.
	
everything_clean: 
	@make clean finish	

$(everyrules): $(PID)_% : everything_%

# clean all things including util
.PHONY:platform_clean
platform_clean: $(addsuffix _clean, $(everything)) $(addsuffix _clean, $(platform_util))
	@echo make $@ done
	
##################################################################################################
#
#	build host utils, such as:fakeroot make_squashfs make_flash md5_des etc.
#
##################################################################################################
FAKEROOT_PATH=$(CONFIG_FAKEROOT_PATH)
fakeroot_package=fakeroot-1.9.1
.PHONY:fakeroot_prep		
fakeroot_prep:
	@cd $(FAKEROOT_PATH) && \
		rm -rf $(fakeroot_package) && \
		tar -xf $(fakeroot_package).tar.gz && \
		cd $(fakeroot_package) && \
		sed -i 's/        SHELL=/        SHELL=\/bin\/bash #/' ./configure &&\
		./configure --prefix=/usr --disable-nls TOOLPREFIX= STRIP= &&\
		make && sed \
		-e 's,^PREFIX=.*,PREFIX=$(FAKEROOT_PATH)/$(fakeroot_package),g' \
		-e 's,^BINDIR=.*,BINDIR=$(FAKEROOT_PATH)/$(fakeroot_package),g' \
		-e 's,^PATHS=.*,PATHS=$(FAKEROOT_PATH)/$(fakeroot_package)/.libs:/lib:/usr/lib,g' \
		scripts/fakeroot > $(CONFIG_UTIL_PATH)/fakeroot && \
		chmod u+x $(CONFIG_UTIL_PATH)/fakeroot		

fakeroot_clean:
	@echo "make fakeroot_clean" 
	rm -rf $(CONFIG_UTIL_PATH)/fakeroot $(FAKEROOT_PATH)/$(fakeroot_package)

##################################################################################################
#
#	prepare toolchain.
#
##################################################################################################
TOOLCHAIN_PATH=$(CONFIG_TOOLCHAIN_PATH)

.PHONY:toolchain_prep
toolchain_prep:
	$(MAKE) -C $(TOOLCHAIN_PATH) toolchain_prep

##################################################################################################
#
#	prepare rootfs templet
#
##################################################################################################
ROOTFS_PATH=$(CONFIG_ROOTFS_PATH)

.PHONY:fs_prep
fs_prep:
	$(MAKE) -C $(ROOTFS_PATH) fs_prep

##################################################################################################
#
#	prepare make_flash
#
##################################################################################################
MAKEFLASH_PATH=$(CONFIG_MAKEFLASH_PATH)

.PHONY:make_flash_prep
make_flash_prep:
	#$(MAKE) -C $(MAKEFLASH_PATH)
	cp -f $(MAKEFLASH_PATH)/make_flash $(IMAGEPATH) &&\
	cd $(IMAGEPATH) &&\
	chmod 777 make_flash
	
make_flash_clean:
	@echo "make make_flash_clean" 
	rm -f $(MAKEFLASH_PATH)/make_flash

##################################################################################################
#
#	prepare json2bin
#
##################################################################################################
JSON2BIN_PATH=$(CONFIG_JSON2BIN_PATH)

.PHONY:json2bin_prep
json2bin_prep:
	#$(MAKE) -C $(JSON2BIN_PATH)
	cp -f $(JSON2BIN_PATH)/json2bin $(IMAGEPATH) &&\
	cd $(IMAGEPATH) &&\
	chmod 777 json2bin	

##################################################################################################
#
#	prepare make_header
#
##################################################################################################
MAKEHEADER_PATH=$(CONFIG_MAKEHEADER_PATH)

.PHONY:make_header_prep
make_header_prep:
	#$(MAKE) -C $(MAKEHEADER_PATH)
	cp -f $(MAKEHEADER_PATH)/make_header.sh $(IMAGEPATH) &&\
	cd $(IMAGEPATH) &&\
	chmod 777 make_header.sh
	cp -f $(MAKEHEADER_PATH)/make_header $(IMAGEPATH) &&\
	cd $(IMAGEPATH) &&\
	chmod 777 make_header
#################################################################################################
#
#	uboot build( cfe )
#
##################################################################################################
UBOOT_PATH=$(CONFIG_UBOOT_PATH)

.PHONY:uboot_build uboot_install uboot_clean

uboot_build:
	$(MAKE) -C $(UBOOT_PATH) uboot

uboot_install:
	@echo uboot: installing u-boot.bin
	@cp $(UBOOT_PATH)/u-boot.bin $(BOARD_TOPDIR)/images/$(PID)/u-boot.bin

uboot_clean:
	@echo Making uboot clean
	$(MAKE) -C $(UBOOT_PATH) clean
	cd $(UBOOT_PATH) && rm -f $(UBOOT_PATH)/u-boot.bin

#################################################################################################
#
#	factory uboot build( cfe )
#
##################################################################################################

.PHONY:factory_uboot_build factory_uboot_install factory_uboot_clean

factory_uboot_build: factory_uboot_clean
	$(MAKE) -C $(UBOOT_PATH) uboot CFG_DOUBLE_BOOT_FACTORY=1

factory_uboot_install:
	@echo uboot: installing factory-uboot.bin
	@cp $(UBOOT_PATH)/factory-uboot.bin $(BOARD_TOPDIR)/images/$(PID)/factory-uboot.bin

factory_uboot_clean:
	@echo Making factory-uboot clean
	$(MAKE) -C $(UBOOT_PATH) clean
	cd $(UBOOT_PATH) && rm -f $(UBOOT_PATH)/factory-uboot.bin

#################################################################################################
#
#	fs uboot build( cfe )
#
##################################################################################################

.PHONY:fs_uboot_build fs_uboot_install fs_uboot_clean

fs_uboot_build: fs_uboot_clean
	$(MAKE) -C $(UBOOT_PATH) uboot CFG_DOUBLE_BOOT_SECOND=1

fs_uboot_install:
	@echo uboot: installing fs-uboot.bin
	@cp $(UBOOT_PATH)/fs-uboot.bin $(BOARD_TOPDIR)/images/$(PID)/fs-uboot.bin

fs_uboot_clean:
	@echo Making fs-uboot clean
	$(MAKE) -C $(UBOOT_PATH) clean
	cd $(UBOOT_PATH) && rm -f $(UBOOT_PATH)/fs-uboot.bin

##################################################################################################
#
#	kernel build.
#
##################################################################################################
KERNEL_PATH=$(CONFIG_KERNEL_PATH)

.PHONY:kernel_build kernel_install kernel_clean

kernel_config:
	@echo kernel: will config kernel.

kernel_build: kernel_config
	$(MAKE) -C $(KERNEL_PATH) kernel_build

kernel_install:
	@echo kernel: installing kernel
	cp $(KERNEL_PATH)/vmlinux $(BOARD_TOPDIR)/images/$(PID)/vmlinux
	cp $(KERNEL_PATH)/vmlinux.bin $(BOARD_TOPDIR)/images/$(PID)/vmlinux.bin
	cp $(KERNEL_PATH)/vmlinux.bin.gz $(BOARD_TOPDIR)/images/$(PID)/vmlinux.bin.gz

kernel_clean:
	rm -f $(KERNEL_PATH)/vmlinux
	rm -f $(KERNEL_PATH)/vmlinux.bin
	rm -f $(KERNEL_PATH)/vmlinux.bin.gz
	$(MAKE) -C $(KERNEL_PATH) kernel_clean

###################################################################################
#   makemod(subdirs, targets)
#  subdirsĿ¼µںģ飬
#  installʱtargetsĿ$(INSTALL_ROOT)/lib/modules/$(KERNELVER)/kernel/
###################################################################################
kernel_modules_%: $(addsuffix _%, $(kernel_modules_target))
	@echo make $@ at `date`
	
##################################################################################################
#
#	applications.
#
##################################################################################################
apps_%: $(addsuffix _%, $(apps_target))
	@echo make $@ at `date`	
	
sdk_apps_%: $(addsuffix _%, rt2880_app)
	@echo make $@ at `date`		

tplibs_%: $(addsuffix _%, $(tplibs_target))
	@echo make $@ at `date`	

tpapps_%: tplibs_build tplibs_install $(addsuffix _%, $(tpapps_target))
	@echo make $@ at `date`		
	
##################################################################################################
#
#	package
#
#	package bootloader,root filesystem, kernel, *bin  etc which for board to burn or upgrade
#
##################################################################################################
PACKAGE_PATH=$(CONFIG_PACKAGE_PATH)

.PHONY:package

image:
	$(MAKE) -C $(PACKAGE_PATH)

image_dboot:
	$(MAKE) -C $(PACKAGE_PATH) CFG_DOUBLE_BOOT=1
	
#################################################################################################
#
#	sub-make
#		if a target can not be found in this main-control Makefile,
#		then try to make it  using the subdirectory's Makefile specified by
#		make BUILD_SUBDIR=dir
#
##################################################################################################
else
%:
	$(MAKE) -C $(BUILD_SUBDIR) $@
endif